package figuras;


/**
 *
 * @author Pedro
 */

/*Nota: esta implementação considera que o trapézio possui exatamente um par de lados paralelos */

import exceptions.ExcecaoDeMedida;
import interfaces.FiguraGeometrica;

public class Trapezio implements FiguraGeometrica{
    private int baseMaior = 1; //Estas inicializações são feitas pois as funções set sempre chamam a função
    private int baseMenor = 0;//isTrapezio() que por sua vez sempre verifica a diferença entre as bases
    private int altura;      //maior e menor para que seja garantido que este trapézio não seja um paralelogramo
                            // assim, caso não tivessem essa inicialização seriam inicializadas com o valor default
                           //para inteiros, que é 0 no Javao que quebraria a função isTrapezio() e todas as outras
                          // que a chamam. 
Trapezio(int B, int b, int alt)throws ExcecaoDeMedida{
    if(isMedidaValida(B) && isMedidaValida(b) && isMedidaValida(alt))
    {
        setBaseMaior(B);
        setBaseMenor(b);
            setAltura(alt);
        }
        else
            throw new ExcecaoDeMedida();
        }
    
    public int getBaseMaior(){
        return baseMaior;
    }
    
    public int getBaseMenor(){
        return baseMenor;
    }
    
    public int getAltura(){
        return altura;
    }
    
    public void setBaseMenor(int b)throws ExcecaoDeMedida{
        if(isTrapezio() && isMedidaValida(b))
            baseMenor = b;
        else
            throw new ExcecaoDeMedida();
    }
    
    public void setBaseMaior(int B)throws ExcecaoDeMedida{
        if(isTrapezio() & isMedidaValida(B))
            baseMaior = B;
        else
            throw new ExcecaoDeMedida();
    }
    
    public void setAltura(int a)throws ExcecaoDeMedida{
        if(isMedidaValida(a))
            altura = a;
        else
            throw new ExcecaoDeMedida();
    }
    
    public boolean isMedidaValida(int medida){
        boolean resp = ((medida > 0)? true : false );
        return resp;
    }
    
    public boolean isTrapezio(){
        boolean resp = ((getBaseMaior() > getBaseMenor())? true : false);
        return resp;
    }
    
    @Override
    public double perimetro(){
        double dif = getBaseMaior() - getBaseMenor();
        double aux = dif * dif + getAltura() * getAltura();
        //double hipotenusa = Math.pow(aux, 1.0/2.0);
        double hipotenusa = Math.sqrt(aux);
        return (getBaseMaior() + getBaseMenor() + getAltura() + hipotenusa);
        
        /*Cálculo  feito sempre levando em consideração que a altura encontra a base menor e a base menor
         * num ponto 0, a partir daí o quarto lado é calculado trançando-se um segmento de reta unindo a 
         * base menor à base maior, isso é feito para que possamos calcular o quarto lado sempre a partir
         * de um triângulo retângulo cuja base é a diferença entre as bases do trapézio, a altura é 
         * a altura do trapézio e a hipotenusa o próprio quarto lado, ou seja, será sempre considerado um
         * trapézio retângulo para o cálculo do perímetro.
         */
    }
    
    @Override
    public double area(){
        return (((getBaseMaior() + getBaseMenor())/2) * getAltura());
    }
}
